﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;

namespace FlyShop
{
    public partial class FrmCancelaVenda : Form
    {

        // Indica a linha selecionada na grid
        int linhaSelecionadaGrid;


        OleDbConnection conexao;
        String strConexao = "Provider=MSDAORA;Data Source=localhost;User ID=pi;Password=pi";

        String sqlConsultaVendas = "select ve.cod_venda, pc.nome, vo.nome, vo.data_partida, ve.num_assento, ve.valor, ve.flag_cancelada, ve.data_venda, vo.cod_voo from venda ve join voo vo on ve.cod_voo = vo.cod_voo join pessoa pc on ve.cod_cliente = pc.cod_pessoa";

        String sqlCanceladaVenda = "update venda set flag_cancelada = 's' where cod_venda = ?";
        String sqlUpdateQntAssentosVoo = "update voo set assentos_disponiveis = (select assentos_disponiveis + 1 from voo where cod_voo = ?) where cod_voo = ?";
        String sqlConsultaFiltro = "select ve.cod_venda, pc.nome, vo.nome, vo.data_partida, ve.num_assento, ve.valor, ve.flag_cancelada, ve.data_venda, vo.cod_voo from venda ve join voo vo on ve.cod_voo = vo.cod_voo join pessoa pc on ve.cod_cliente = pc.cod_pessoa and vo.nome like ? and pc.nome like ?";

        OleDbDataAdapter da;
        DataSet ds;

        public FrmCancelaVenda()
        {
            InitializeComponent();
        }

        private void FrmCancelaVenda_Load(object sender, EventArgs e)
        {
            // Estabelece conexão
            try
            {
                conexao = new OleDbConnection(strConexao);
                conexao.Open();
            }
            catch (Exception)
            {
                MessageBox.Show(this, "Não foi possível se conectar ao banco de dados.", "Conexão",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }

            // Comando para configurar a sessão
            // Configura para o banco de dados ficar case-insensitive  
            OleDbCommand comandoAlteraSessao = new OleDbCommand("alter session set nls_sort=BINARY_CI", conexao);
            comandoAlteraSessao.ExecuteNonQuery();

            comandoAlteraSessao.CommandText = "alter session set nls_comp=LINGUISTIC";
            comandoAlteraSessao.ExecuteNonQuery();

            atualiza();
            formataGrid();
        }


        public void atualiza() {

            da = new OleDbDataAdapter(sqlConsultaVendas, conexao);
            ds = new DataSet();
            da.Fill(ds, "venda");

            dgvVenda.DataSource = ds.Tables["venda"];

            dgvVenda.ClearSelection();
            linhaSelecionadaGrid = -1;
            lblMensagem.Text = "";
            alertNotificacao.Hide();

        }

        public void formataGrid() {

            // Código da venda
            dgvVenda.Columns[0].Visible = false;
            
            dgvVenda.Columns[1].HeaderText = "Cliente";
            dgvVenda.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

            dgvVenda.Columns[2].HeaderText = "Voo";
            dgvVenda.Columns[2].Width = 150;

            dgvVenda.Columns[3].HeaderText = "Partida";
            dgvVenda.Columns[3].Width = 110;

            dgvVenda.Columns[4].HeaderText = "Assento";
            dgvVenda.Columns[4].Width = 60;

            dgvVenda.Columns[5].HeaderText = "Valor";
            dgvVenda.Columns[5].Width = 80;

            dgvVenda.Columns[6].HeaderText = "Cancelada";
            dgvVenda.Columns[6].Width = 70;

            dgvVenda.Columns[7].HeaderText = "Data venda";
            dgvVenda.Columns[7].Width = 110;

            // Código do vôo
            dgvVenda.Columns[8].Visible = false;

        }

        private void FrmCancelaVenda_FormClosed(object sender, FormClosedEventArgs e)
        {
            conexao.Close();
        }

        private void dgvVenda_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            linhaSelecionadaGrid = e.RowIndex;
        }

        private void dgvVenda_Sorted(object sender, EventArgs e)
        {
            linhaSelecionadaGrid = -1;
            dgvVenda.ClearSelection();
        }

        private void btnCancelarVenda_Click(object sender, EventArgs e)
        {
            if (linhaSelecionadaGrid != -1)
            {
                // Obtem as informações da data de partida
                string dataPartidaString = dgvVenda.Rows[linhaSelecionadaGrid].Cells[3].Value.ToString();
                DateTime dataPartida = DateTime.Parse(dataPartidaString);
                int rDatas = dataPartida.CompareTo(DateTime.Now);

                // pega o valor da flag de cancelamento
                string flgCancelada = dgvVenda.Rows[linhaSelecionadaGrid].Cells[6].Value.ToString();
                
                if (flgCancelada.Equals("s"))
                {
                    lblMensagem.Text = "Não é possível cancelar uma venda que já está cancelada.";
                    alertNotificacao.Show(); 
                }
                else if (rDatas <= 0)
                {
                    // retorno = 0 : mesma data
                    // retorno < 0 : data menor
                    lblMensagem.Text = "Não é possível cancelar a venda da passagem de um voo que já partiu.";
                    alertNotificacao.Show();
                }
                else
                {
                    // Verifica se o usuário realmente deseja cancelar a venda
                    DialogResult confirmacao = 
                        MessageBox.Show(this, "Deseja cancelar a venda selecionada?", "Cancelamento", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (confirmacao == DialogResult.Yes)
                    {
                        try
                        {
                            OleDbCommand comandoCancelaVenda = new OleDbCommand(sqlCanceladaVenda, conexao);

                            OleDbParameter pCodVenda = new OleDbParameter("cod_venda", OleDbType.Integer);
                            pCodVenda.Value = Int32.Parse(dgvVenda.Rows[linhaSelecionadaGrid].Cells[0].Value.ToString());
                            comandoCancelaVenda.Parameters.Add(pCodVenda);

                            // Update da venda
                            comandoCancelaVenda.ExecuteNonQuery();

                            // Comando para atualizar o registro do voo
                            OleDbCommand comandoUpdateAssentosVoo = new OleDbCommand(sqlUpdateQntAssentosVoo, conexao);

                            OleDbParameter pCodVoo1 = new OleDbParameter("cod_voo", OleDbType.Integer);
                            pCodVoo1.Value = Int32.Parse(dgvVenda.Rows[linhaSelecionadaGrid].Cells[8].Value.ToString());
                            comandoUpdateAssentosVoo.Parameters.Add(pCodVoo1);

                            OleDbParameter pCodVoo2 = new OleDbParameter("cod_voo", OleDbType.Integer);
                            pCodVoo2.Value = Int32.Parse(dgvVenda.Rows[linhaSelecionadaGrid].Cells[8].Value.ToString());
                            comandoUpdateAssentosVoo.Parameters.Add(pCodVoo2);

                            // Update da quantidade de assentos do vôo (aumenta 1)
                            comandoUpdateAssentosVoo.ExecuteNonQuery();

                            MessageBox.Show(this, "A venda foi cancelada com sucesso.", "Cancelamento", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            atualiza();
                        }
                        catch (Exception)
                        {
                            MessageBox.Show(this, "Não foi possível se conectar ao banco de dados.", "Conexão",
                             MessageBoxButtons.OK, MessageBoxIcon.Error);
                            Application.Exit();
                        }

                    }

                }

            }
            else
            {
                lblMensagem.Text = "Selecione um registro para cancelar a venda.";
                alertNotificacao.Show();
            }
        }

        private void filtro_TextChanged(object sender, EventArgs e)
        {
            // Monta o comando para fazer a filtragem de vendas
            OleDbCommand comandoFiltro = new OleDbCommand(sqlConsultaFiltro, conexao);

            OleDbParameter pNomeVoo = new OleDbParameter("nome_voo", OleDbType.VarChar);
            pNomeVoo.Value = txtNomeVoo.Text.Trim() + "%";
            comandoFiltro.Parameters.Add(pNomeVoo);

            OleDbParameter pNomeCliente = new OleDbParameter("nome_cliente", OleDbType.VarChar);
            pNomeCliente.Value = txtNomeCliente.Text.Trim() + "%";
            comandoFiltro.Parameters.Add(pNomeCliente);

            if (ckbNaoCancelados.Checked)
            {
                comandoFiltro.CommandText += " and flag_cancelada = 'n'";
            }

            da = new OleDbDataAdapter(comandoFiltro);
            ds = new DataSet();
            da.Fill(ds, "venda");

            dgvVenda.DataSource = ds.Tables["venda"];

            dgvVenda.ClearSelection();
            linhaSelecionadaGrid = -1;


        }

        private void FrmCancelaVenda_KeyDown(object sender, KeyEventArgs e)
        {
            //Hotkey para a tecla ESC fechar a janela
            if (e.KeyData == (Keys.Escape))
            {
                this.Close();
            }
        }
    }
}
